/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有，侵权必究！
 */

package com.ruoyi.common.core.controller;

import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.RRException;
import com.ruoyi.common.jdkext.Action0;
import com.ruoyi.common.utils.R;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.function.Supplier;

/**
 * Controller公共组件
 * @author zxb
 *
 */
@Slf4j
public abstract class AbstractController {

	protected static <TService> TService ref(Class<TService> clazz) {
		return SpringContextUtils.getBean(clazz);
	}

	public static String getActiveProfile() {
		return SpringContextUtils.getApplicationContext().getEnvironment().getActiveProfiles()[0];
	}

	public static String getSystemType(){
		return SpringContextUtils.getApplicationContext().getEnvironment().getProperty("my-config.system-type");
	}



	/**
	 * 有返回值 异常处理
	 * @param supplier
	 * @param <T>
	 * @return
	 * call(()-> xxxService.queryPage(params));//调用方式
	 */
	protected static <T> R callData(Supplier<T> supplier){
		try{
			return R.ok().put("data",supplier.get());
		}catch(RRException e) {
			log.error("RRException:{}", e.getMessage(), e);
			return R.error(e.getMessage());
		} catch(Exception e){
			log.error("获取数据异常信息:{}",e.getMessage(),e);
			if("prod".equals(getActiveProfile())){
				return R.error("网络异常,请联系管理员");
			}else{
				return R.error(e.getMessage());
			}
		}
	}


	/**
	 * 无返回值调用 异常处理
	 * @param x
	 * @return
	 *   callAuto(()->barrierService.saveBarrier(barrier))
	 */
	protected static R callAuto(Action0 x){
		try{
			x.call();
			return R.ok();
		}catch(RRException e){
			log.error("RRException:{}",e.getMessage(),e);
			return R.error(e.getMessage());
		}catch(Exception e){
			log.error("异常信息:{}",e.getMessage(),e);
			if("prod".equals(getActiveProfile())){
				return R.error("网络异常,请联系管理员");
			}else{
				return R.error(e.getMessage());
			}
		}
	}



	/**
	 * 获取用户缓存信息
	 */
	public LoginUser getLoginUser()
	{
		return SecurityUtils.getLoginUser();
	}

	/**
	 * 获取登录用户id
	 */
	public Long getUserId()
	{
		return getLoginUser().getUserId();
	}

	/**
	 * 获取登录部门id
	 */
	public Long getDeptId()
	{
		return getLoginUser().getDeptId();
	}

	/**
	 * 获取登录用户名
	 */
	public String getUsername()
	{
		return getLoginUser().getUsername();
	}
}
